package org.zachary.imitation.raft.storage;

import org.zachary.imitation.raft.Lifecycle;
import org.zachary.imitation.raft.PeerId;
import org.zachary.imitation.raft.option.RaftMetaStorageOptions;

/** 节点元数据存储器接口，可以有多种实现，比如基于本地文件的，基于 http 远程服务器的，等等 */
public interface RaftMetaStorage extends Lifecycle<RaftMetaStorageOptions> {

	/** 向元数据存储器写入节点的当前任期 */
	boolean setTerm(final int term);
	/** 从元数据存储器获取节点的当前任期 */
	int getTerm();

	/** 向元数据存储器写入当前节点在当前任期给哪个节点投了票 */
	boolean setVotedFor(final PeerId peerId);
	/** 从元数据存储器获取当前节点在当前任期给哪个节点投了票 */
	PeerId getVotedFor();

	/** 向元数据存储器同时写入 节点的当前任期、当前节点在当前任期给哪个节点投了票 */
	boolean setTermAndVotedFor(final long term, final PeerId peerId);
}
